package com.congwulin.wechat.util.service.vo;

import com.congwulin.wechat.entity.common.SuperVO;
import com.congwulin.wechat.util.SpringUtil;
import com.congwulin.wechat.util.UserInfoUtil;
import com.congwulin.wechat.util.interfaces.AbstractVOService;

import java.sql.Timestamp;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class VOUpdateService extends AbstractVOService{
    /**
     * 实体抽象服务构造函数
     *
     * @param dao 实体保存数据库器
     */
    public VOUpdateService(VOPersistent dao) {
        super(dao);
    }

    /**
     * 修改实体数组
     *
     * @param vos 实体数组
     * @return  保存后的实体列表
     */
    public List<SuperVO> update(SuperVO[] vos) {
        List<SuperVO> list = Arrays.asList(vos);
        return (List<SuperVO>) this.update(list);
    }

    /**
     * 修改实体列表
     *
     * @param list 实体列表
     * @return  保存后的实体数组
     */
    @SuppressWarnings("unchecked")
    public List<?> update(List<?> list) {
        List<SuperVO> paralist = (List<SuperVO>) list;
        Map<String,String> lockmap = null;
        try {
            // 加锁、校验时间戳
            lockmap = this.lock(paralist);
            this.checkTs(paralist);

            // 设置修改审计信息
            this.setUpdateAuditInfo(paralist);

            this.getDAO().update(paralist);
        } finally {
            // 释放锁
            this.unlock(lockmap);
        }

        return list;
    }

    private void setUpdateAuditInfo(List<SuperVO> list) {
        // 修改时间
        Timestamp modifiedtime = new Timestamp(System.currentTimeMillis());
        // 修改人
        UserInfoUtil util = SpringUtil.getBean(UserInfoUtil.class);
        String modifier = util.getContent().getId();
        String modifiername = util.getContent().getName();

        for (SuperVO vo : list) {
            vo.setModifiedtime(modifiedtime);
            vo.setModifier(modifier);
            vo.setModifier_name(modifiername);
        }
    }
}
